package py.com.alfa.escriba.web.services.impl;

import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.EscribanosDAO;
import py.com.alfa.escriba.persistence.dto.EscribanosDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.EscribanosService;

public class EscribanosServiceImpl implements EscribanosService{

  private EscribanosDAO escribanosDAO;

  public void setEscribanosDAO(EscribanosDAO escribanosDAO) {
    this.escribanosDAO = escribanosDAO;
  }

  @Override
  public List<EscribanosDTO> listEscribanos(InvocationContext ic) throws ServiceException {
    List<EscribanosDTO> escribanoss =  escribanosDAO.listEscribanos();

    return escribanoss;
  }

  @Override
  public EscribanosDTO getEscribanos(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    EscribanosDTO escribanos =  escribanosDAO.getEscribanosById(id);

    if (escribanos == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"escribanos.notfound", id);

    return escribanos;
  }

  @Override
  public void deleteEscribanos(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    EscribanosDTO escribanos =  escribanosDAO.getEscribanosById(id);

    if(escribanos == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"escribanos.notfound", id);

    try {
      escribanosDAO.deleteEscribanos(escribanos);
    }
    catch (DataIntegrityViolationException e){
      throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "escribanos.constraint.violation", id);
    }

  }

  @Override
  public EscribanosDTO updateEscribanos(Long id, EscribanosDTO dto, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    if (null == dto)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    EscribanosDTO escribanos = escribanosDAO.getEscribanosById(id);

    if (escribanos == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"escribanos.notfound", id);

    escribanos.setIdpersona(dto.getIdpersona());
    escribanos.setRegitronro(dto.getRegitronro());
    escribanos.setActivo(dto.getActivo());
    escribanos.setIdusuario(dto.getIdusuario());
    escribanos.setFechacreacion(dto.getFechacreacion());
    escribanos.setIdusuariomodificacion(dto.getIdusuariomodificacion());
    escribanos.setFechamodificacion(dto.getFechamodificacion());
 

    Utils.validarDTO(dto);

    escribanosDAO.updateEscribanos(dto);

    return escribanos;
  }

  @Override
  public EscribanosDTO createEscribanos(EscribanosDTO dto, InvocationContext ic) throws ServiceException {
    if (dto == null)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    try {

      Utils.validarDTO(dto);

      escribanosDAO.createEscribanos(dto);
    }
    catch (DuplicateKeyException e){
      throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "escribanos.duplicate.key");
    }

    return dto;
  }

}